package com.naiterui.ehp.bs.patient.dao;

import java.math.BigInteger;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.naiterui.ehp.bp.domain.Patient;

/**
 * 患者基础信息持久化接口
 * @Description 提供持久化服务接口
 * @version 2015年6月18日 上午9:55:37 by Amber
 */
public interface IPatientDao {

    /**
     * 根据openId查询患者信息
     * @param openId
     * @return Patient <患者持久层实体bean>
     * @History 2015年6月20日 下午4:10:18 by Amber
     */
    Patient getPatientByOpenId(String openId);

    /**
     * 根据unionId查询患者信息
     * @param unionId
     *        是否写库查询
     * @return Patient <返回值描述>
     * @History 2015年6月27日 下午3:01:48 by Amber
     */
    Patient getPatientByUnionId(String unionId);

    /**
     * 是否已关注该医生
     * @param patientId
     *        患者id
     * @param doctorId
     *        医生id
     * @return boolean true：已关注；false：未关注
     * @History 2015年6月21日 下午9:56:51 by Amber
     */
    boolean existAttendRelation(Long patientId, Long doctorId);

    /**
     * 是否已绑定该私人医生
     * @param patientId
     *        患者id
     * @param doctorId
     *        医生id
     * @return boolean true：已绑定；false：未绑定
     * @History 2015年6月21日 下午9:57:23 by Amber
     */
    boolean existPersonalRelation(Long patientId, Long doctorId);

    /**
     * 解除关注
     * @param patientId
     *        患者id
     * @param doctorId
     *        医生id
     * @History 2015年6月21日 下午10:10:43 by Amber
     */
    void cancelAttend(Long patientId, Long doctorId);

    /**
     * 获取有效私人医生数量，未禁用，放开审核状态 by zhoupeipei @2015-10-08
     * @param patientId
     *        患者id
     * @return int <私人医生id数组>
     * @History 2015年6月28日 下午2:46:01 by Amber
     */
    List<BigInteger> getPersonalIds(Long patientId);

    /**
     * 获取有效私人医生数量，指定是否禁用，放开审核状态 by zhoupeipei @2015-10-08
     * @param patientId
     *        患者id
     * @param isDisable
     *        是否含禁用医生
     * @return int <私人医生id数组>
     * @History 2015年6月28日 下午2:46:01 by Amber
     */
    List<BigInteger> getPersonalIds(Long patientId, boolean isDisable);

    /**
     * 根据手机号获取用户
     * @param phoneNum
     *        手机号
     * @return Patient <返回值描述>
     * @History 2015年7月5日 下午9:25:47 by Amber
     */
    Patient getByPhone(String phoneNum);

    /**
     * 添加私人医生
     * @param doctorId
     *        医生id
     * @param patientId
     *        患者id
     * @param source
     *        来源(1:公众号,2:互联网医院) changedBy xixian
     * @return void <返回值描述>
     * @History 2015年7月5日 下午10:14:18 by Amber
     */
    void addPersonalDoctor(Long doctorId, Long patientId, int source);

    /**
     * 关注医生
     * @param doctorId
     *        医生id
     * @param patientId
     *        患者id
     * @return void <返回值描述>
     * @History 2015年7月5日 下午10:19:39 by Amber
     */
    void attendDoctor(Long doctorId, Long patientId);

    /**
     * 更新患者信息
     * IPatientDao.update()
     *
     * @param patient
     *
     * @Author fangguanhong
     * @Date 2016-3-9
     * @since 1.0.0
     */
    void update(Patient patient);

    /**
     * 保存患者信息 IPatientDao.savePatient()
     * @Author Amber
     * @Date 2015年12月3日
     * @since 1.0.0
     * @param patient
     */
    void saveOrUpdatePatient(Patient patient);

    /**
     * 根据id查询实体对象
     * IPatientDao.getPatient()
     * @Author Amber
     * @Date 2015年12月8日
     * @since 1.0.0
     * @param patientId
     * @return
     */
    Patient getPatient(Long patientId);

    /**
     * 修改用户为为取消关注状态
     * IPatientDao.updateNoCancel()
     * @Author Amber
     * @Date 2015年12月14日
     * @since 1.0.0
     * @param unionId
     * @param cancelStatus 0：未知；1:未取消；2：取消；
     */
    void updateCancelStatus(String unionId, int cancelStatus);

    /**
     * 根据手机号获取患者记录
     * IPatientDao.getPatientByPhone()
     * @Author fangguanhong
     * @Date 2016-4-11
     * @since 1.0.0
     * @param phone
     * @return
     */
    Patient getPatientByPhone(String phone);

    /**
     * 根据患者Id集合获取患者对象Map
     * IPatientDao.getPatientMap()
     * @Author mudou
     * @Date 2017年7月3日
     * @since 2.8.0
     * @param patientIdSet
     * @return
     */
    Map<Long, Patient> getPatientMap(Set<Long> patientIdSet);

    /**
     * 更新患者身份证号
     * IPatientDao.updateIdNo()
     * @Author fangguanhong
     * @Date 2017年11月24日
     * @since 1.0.0
     * @param patientId
     * @param idNo
     */
    void updateIdNo(Long patientId, String idNo);

    /**
     * 指获取患者对这些医生的私人状态
     * IPatientDao.existPersonalByDoctorIds()
     * @Author lichaopi
     * @Date 2018年3月16日
     * @since 1.0.0
     * @param patientId
     * @param doctorIdList
     * @return
     */
    Map<Long, Boolean> existPersonalByDoctorIds(Long patientId, List<Long> doctorIdList);

    /**
     * 根据ID获取信息
     * @param id
     * @return
     */
    Patient get(Long id);

    /**
     * 保存
     * @param patient
     * @return
     */
    Patient save(Patient patient);

    /**
     * 保存或更新
     * @param patient
     * @return
     */
    Patient saveOrUpdate(Patient patient);

    /**
     * 根据miniAppId查询患者信息
     * @param miniAppId
     *        是否写库查询
     * @return Patient <返回值描述>
     * @History 2015年6月27日 下午3:01:48 by Amber
     */
    Patient getPatientByMiniOpenId(String miniAppId);
}
